package org.fone.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import org.fone.pojo.Table;
import org.fone.pojo.TableInfo;
import org.fone.service.impl.TableServiceImpl;
import org.fone.utils.R;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RestController
public class TableController {
    private final TableServiceImpl tableService;
    public TableController(TableServiceImpl tableService) {
        this.tableService = tableService;
    }

    /**
     * 获取所有表的 表名，大小，创建时间
     * @return  json 格式字符串
     */
    @ApiOperation(value = "获取所有表的名字和字段", notes = "获取所有表的名字和字段等信息",httpMethod = "GET")
    @ResponseBody
    @GetMapping("/list")
    public R getTabList(){
        List<TableInfo> tables = tableService.listTable();
        tables.forEach(System.out::println);
        if (ObjectUtil.isEmpty(tables)) {
            return R.error("表名为空");
        } else if (ObjectUtil.isNotEmpty(tables)){
            return R.ok().put("data",tables);
        } else {
            return R.error();
        }
    }


    /**
     * 获取表格内容，包括了表格的：表名，大小，创建时间，字段+字段类型，和数据
     * @param tabName 表名
     * @return 表格对象
     */
    @ApiOperation(value = "获取一张表的内容",notes = "获取一张表的内容",httpMethod = "GET")
    @ResponseBody
    @GetMapping("/table")
    R getTable(String tabName){
        if (tabName==null||"".endsWith(tabName)) return R.error("参数错误");
        Table table = tableService.readTable(tabName);
        System.out.println("table = " + table);
        System.out.println("R.ok().put(\"data\",table) = " + R.ok().put("data",table));
        System.out.println("R.ok().put(\"data\",table) = " + R.ok().put("data",table).get("data"));
        if (ObjectUtils.isEmpty(table))
            return R.error("没有找到此表");
        return R.ok().put("data",table);
    }

    /**
     * 数据流操作，运行前会检查参数是否合法
     * @param data data为一个json对象
     * @return 返回 flag=0 时为成功运行，否则 flag 则表示错误的节点 id。运行结果以<int,Table>的形式存在 data.resultMap 中
     */
    @ApiOperation(value = "运行数据流，返回中间数据及结果",notes = "运行数据流，返回中间数据及结果。运行前会检查参数是否合法，返回 flag=0 时为成功运行，否则 flag 则表示错误的节点 id。运行结果以<int,Table>的形式存在 data.resultMap 中",httpMethod = "POST")
    @ResponseBody
    @PostMapping("/stream")
    R dataStream(@RequestBody String data) {
        System.out.println("stream_data = " + data);
        try {
            JSONObject para = new JSONObject(data);
            JSONObject result = tableService.dataStream(para);
            if (result.getInt("flag") == 0) return R.ok().put("data", result);
            else return R.error().put("data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("参数错误");
        }
    }

    @ResponseBody
    @PostMapping("/createTable")
    R createTable(@RequestBody String data) {
        try {
            Table table = JSONUtil.toBean(data, Table.class);
            Pattern pattern = Pattern.compile("[0-9]*");
            Matcher isNum = pattern.matcher(table.getTableName());
            if (isNum.matches()) {
                return R.error("表名不能为纯数字");
            }
            if (table.initDataType()){
                if (tableService.findTableCountByTableName(table.getTableName())) return R.error("表已存在");
                if (tableService.createTable(table)) return R.ok();
                return R.error("创建表时发生错误");
            }else return R.error("列名类型错误");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.error("参数错误");
    }
}
